import MarkdownIt from 'markdown-it'

// 初始化markdown解析器
const md = new MarkdownIt({
    html: true,
    linkify: true,
    typographer: true,
    breaks: true
})

// 数学符号映射表
const mathSymbols = {
    // 希腊字母
    '\\alpha': 'α',
    '\\beta': 'β',
    '\\gamma': 'γ',
    '\\Gamma': 'Γ',
    '\\delta': 'δ',
    '\\Delta': 'Δ',
    '\\epsilon': 'ε',
    '\\varepsilon': 'ε',
    '\\zeta': 'ζ',
    '\\eta': 'η',
    '\\theta': 'θ',
    '\\Theta': 'Θ',
    '\\iota': 'ι',
    '\\kappa': 'κ',
    '\\lambda': 'λ',
    '\\Lambda': 'Λ',
    '\\mu': 'μ',
    '\\nu': 'ν',
    '\\xi': 'ξ',
    '\\Xi': 'Ξ',
    '\\pi': 'π',
    '\\Pi': 'Π',
    '\\rho': 'ρ',
    '\\sigma': 'σ',
    '\\Sigma': 'Σ',
    '\\tau': 'τ',
    '\\upsilon': 'υ',
    '\\phi': 'φ',
    '\\Phi': 'Φ',
    '\\chi': 'χ',
    '\\psi': 'ψ',
    '\\Psi': 'Ψ',
    '\\omega': 'ω',
    '\\Omega': 'Ω',

    // 数学运算符
    '\\times': '×',
    '\\div': '÷',
    '\\pm': '±',
    '\\mp': '∓',
    '\\cdot': '·',
    '\\ast': '∗',
    '\\star': '⋆',
    '\\circ': '∘',
    '\\bullet': '•',
    '\\oplus': '⊕',
    '\\ominus': '⊖',
    '\\otimes': '⊗',
    '\\oslash': '⊘',
    '\\odot': '⊙',
    '\\bigcirc': '◯',

    // 关系符号
    '\\leq': '≤',
    '\\geq': '≥',
    '\\neq': '≠',
    '\\approx': '≈',
    '\\equiv': '≡',
    '\\propto': '∝',
    '\\sim': '∼',
    '\\simeq': '≃',
    '\\cong': '≅',
    '\\subset': '⊂',
    '\\supset': '⊃',
    '\\subseteq': '⊆',
    '\\supseteq': '⊇',
    '\\in': '∈',
    '\\ni': '∋',
    '\\notin': '∉',

    // 箭头
    '\\to': '→',
    '\\rightarrow': '→',
    '\\leftarrow': '←',
    '\\Rightarrow': '⇒',
    '\\Leftarrow': '⇐',
    '\\leftrightarrow': '↔',
    '\\Leftrightarrow': '⇔',
    '\\uparrow': '↑',
    '\\downarrow': '↓',
    '\\Uparrow': '⇑',
    '\\Downarrow': '⇓',

    // 其他符号
    '\\infty': '∞',
    '\\partial': '∂',
    '\\nabla': '∇',
    '\\forall': '∀',
    '\\exists': '∃',
    '\\emptyset': '∅',
    '\\angle': '∠',
    '\\triangle': '△',
    '\\square': '□',
    '\\parallel': '∥',
    '\\perp': '⊥',
    '\\ldots': '…',
    '\\cdots': '⋯',
    '\\vdots': '⋮',
    '\\ddots': '⋱',

    // 积分和求和
    '\\int': '∫',
    '\\iint': '∬',
    '\\iiint': '∭',
    '\\oint': '∮',
    '\\sum': '∑',
    '\\prod': '∏',
    '\\coprod': '∐',
    '\\bigcap': '⋂',
    '\\bigcup': '⋃',
    '\\bigsqcup': '⨆',
    '\\bigvee': '⋁',
    '\\bigwedge': '⋀',
    '\\bigodot': '⨀',
    '\\bigotimes': '⨂',
    '\\bigoplus': '⨁'
}

// 上下标处理
function handleSubSuper(content) {
    // 处理下标 _{} 和 _x
    content = content.replace(/_\{([^}]+)}/g, '<sub>$1</sub>')
    content = content.replace(/_([a-zA-Z0-9])/g, '<sub>$1</sub>')

    // 处理上标 ^{} 和 ^x
    content = content.replace(/\^\{([^}]+)}/g, '<sup>$1</sup>')
    content = content.replace(/\^([a-zA-Z0-9])/g, '<sup>$1</sup>')

    return content
}

// 数学公式渲染函数
function renderMath(content) {
    if (!content) return ''

    // 处理行内数学公式 $...$
    content = content.replace(/\$([^$]+)\$/g, (match, mathContent) => {
        let rendered = mathContent

        // 替换数学符号
        Object.keys(mathSymbols).forEach(symbol => {
            const regex = new RegExp(symbol.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')
            rendered = rendered.replace(regex, mathSymbols[symbol])
        })

        // 处理上下标
        rendered = handleSubSuper(rendered)

        return `<span class="math-inline">${rendered}</span>`
    })

    // 处理块级数学公式 $$...$$
    content = content.replace(/\$\$([^$]+)\$\$/g, (match, mathContent) => {
        let rendered = mathContent

        // 替换数学符号
        Object.keys(mathSymbols).forEach(symbol => {
            const regex = new RegExp(symbol.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')
            rendered = rendered.replace(regex, mathSymbols[symbol])
        })

        // 处理上下标
        rendered = handleSubSuper(rendered)

        return `<div class="math-block">${rendered}</div>`
    })

    return content
}

// markdown渲染
export const renderSimpleMarkdown = (content) => {
    if (!content) return ''

    // 先渲染数学公式
    let renderedContent = renderMath(content)
    // 再渲染markdown
    renderedContent = md.render(renderedContent)

    return renderedContent
}

// 导出数学符号映射表，方便外部使用
export { mathSymbols }